package py.edu.ucom.cadira.testWar;

import java.util.Random;
import py.edu.ucom.cadira.game.war.Board;
import py.edu.ucom.cadira.game.war.Movement;
import py.edu.ucom.cadira.game.war.Tab;
import py.edu.ucom.cadira.game.war.WarGame;
import py.edu.ucom.cadira.game.war.WarUser;

public class Tool {
    WarGame war = new WarGame();

    /**
     * Metodo para cargar las fichas para el inicio del juego
     * @param t 
     * @param Tab 
     *            Array de fichas que pasa el SandBox al agente
     * @param j
     *            Tipo de jugada 1 = Todas las fichas en forma aleatorias 2 =
     *            Forma ordenada. Se debe cargar el vector "orden" con los
     *            valores de las fichas. Empieza por la ficha del angulo
     *            inferior derecho del tablero del jugador. Una vez que llega al
     *            extremo sube 1 fila, se empieza a cargar desde la primera
     *            casilla de la derecha hasta el siguiente extremo. Estos pasos
     *            se repite sucesibamente hasta cargar las 40 fichas del jugador
     * @return Retorna el array de fichas con las posiciones para cargar en el
     *         tablero en forma secuancial
     */
    protected Board armarBoardInicial(Board t, Tab[] Tab, int j) {
        Tab[] TabAuxiliar = new Tab[40];
        TabAuxiliar = duplicarFicha(Tab);
        Random r = new Random();
        int z = 0, f, fFin, c = 0;
        if (TabAuxiliar[0].getColor() == WarGame.COLOR_BLUE) {
            f = 6;
            fFin = 9;
        } else {
            f = 0;
            fFin = 3;
        }
        if (j == 1) {// /aleatorio
            for (int i = f; i <= fFin; i++) {
                for (c = 0; c < 10; c++) {
                    do {
                        z = r.nextInt(40);
                    } while (TabAuxiliar[z] == null);
                    if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                        t.setTabInBoard(i, c, TabAuxiliar[z]);
                        TabAuxiliar[z] = null;
                    }
                }
            }
        } else if (j == 2) {
            // Cargar Manualmente este vector con los valores de las
            // Tabs para que ordene y luego retorne para su cargado
            // en el Board
//            int[] orden = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
//                    12, 12, 12, 12, 12, 12, 12 };
            z = 0;
            for (int i = f; i <= fFin; i++) {
                for (int x = 0; x < 10; x++) {
                    t.setTabInBoard(i, x, Tab[z]);
                    Tab[z] = null;
                    z++;
                }
            }
        } else if (j == 3) {
            // randomico entre 7 y 9
            int a = 0, band = 0, posFila = 0;
            posFila = f + (r.nextInt(2) + 1);
            c = r.nextInt(8) + 1;
            do {
                if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 1 && band == 0) {
                    t.setTabInBoard(posFila, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 1;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 8 && band == 1) {
                    t.setTabInBoard(posFila + 1, c + 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 2;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 9 && band == 2) {
                    t.setTabInBoard(posFila - 1, c - 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 3;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 3) {
                    t.setTabInBoard(posFila, c + 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 4;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 4) {
                    t.setTabInBoard(posFila, c - 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 5;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 5) {
                    t.setTabInBoard(posFila + 1, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 6;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 6) {
                    t.setTabInBoard(posFila - 1, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 7;
                    break;
                }
                a++;
            } while (null == null);
            for (int i = f; i <= fFin; i++) {
                for (c = 0; c < 10; c++) {
                    if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                        do {
                            z = r.nextInt(40);
                        } while (TabAuxiliar[z] == null);
                        if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                            t.setTabInBoard(i, c, TabAuxiliar[z]);
                            TabAuxiliar[z] = null;
                        }
                    }
                } // End for
            } // End for
        } // End if
        else if (j == 4) {
            // 7 y 8 pero solo en soreccion de puentes
            int a = 0, band = 0, posFila = 0;
            int colAleatoria = r.nextInt(3);
            if (colAleatoria == 0) {
                c = 1;
            } else if (colAleatoria == 1) {
                c = 5;
            } else if (colAleatoria == 2) {
                c = 8;
            }
            posFila = f + (r.nextInt(2) + 1);
            do {
                if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 1 && band == 0) {
                    t.setTabInBoard(posFila, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 1;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 8 && band == 1) {
                    t.setTabInBoard(posFila + 1, c + 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 2;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 9 && band == 2) {
                    t.setTabInBoard(posFila - 1, c - 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 3;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 3) {
                    t.setTabInBoard(posFila, c + 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 4;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 4) {
                    t.setTabInBoard(posFila, c - 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 5;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 5) {
                    t.setTabInBoard(posFila + 1, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 6;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 6) {
                    t.setTabInBoard(posFila - 1, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 7;
                    break;
                }
                a++;
            } while (null == null);
            for (int i = f; i <= fFin; i++) {
                for (c = 0; c < 10; c++) {
                    if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                        do {
                            z = r.nextInt(40);
                        } while (TabAuxiliar[z] == null);
                        if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                            t.setTabInBoard(i, c, TabAuxiliar[z]);
                            TabAuxiliar[z] = null;
                        }
                    }
                } // End for
            } // End for
        } // End if
        else if (j == 5) {
            // coloca en el octavo en direccion al agua
            int a = 0, band = 0, posFila = 0;
            int colAleatoria = r.nextInt(3);
            if (colAleatoria == 0) {
                c = 1;
            } else if (colAleatoria == 1) {
                c = 5;
            } else if (colAleatoria == 2) {
                c = 8;
            }
            posFila = fFin - 1;
            // PARCHAZO!!!!!
            if (posFila == 2) {
                posFila--;
            }
            do {
                if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 1 && band == 0) {
                    t.setTabInBoard(posFila, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 1;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 8 && band == 1) {
                    t.setTabInBoard(posFila + 1, c + 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 2;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 9 && band == 2) {
                    t.setTabInBoard(posFila - 1, c - 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 3;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 3) {
                    t.setTabInBoard(posFila, c + 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 4;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 4) {
                    t.setTabInBoard(posFila, c - 1, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 5;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 5) {
                    t.setTabInBoard(posFila + 1, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 6;
                } else if (TabAuxiliar[a] != null && TabAuxiliar[a].getValor() == 11 && band == 6) {
                    t.setTabInBoard(posFila - 1, c, TabAuxiliar[a]);
                    TabAuxiliar[a] = null;
                    band = 7;
                    break;
                }
                a++;
            } while (null == null);
            for (int i = f; i <= fFin; i++) {
                for (c = 0; c < 10; c++) {
                    if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                        do {
                            z = r.nextInt(40);
                        } while (TabAuxiliar[z] == null);
                        if (t.getSquareFromBoard(i, c).getTab().getValor() == -1) {
                            t.setTabInBoard(i, c, TabAuxiliar[z]);
                            TabAuxiliar[z] = null;
                        }
                    }
                } // End for
            } // End for
        } // End if
        return t;
    } // End Metodo
    public Tab[] duplicarFicha(Tab[] f) {
        Tab[] p = new Tab[40];
        for (int i = 0; i < p.length; i++) {
            p[i] = f[i];
        }
        return p;
    }
    public Tab[] crearFichaParaAgente(Tab[] tab, int color) {
        for (int i = 0; i < 40; i++) {
            Tab ficha = new Tab();
            ficha.setColor(color);
            tab[i] = ficha;
        }
        return tab;
    }
    public void setearFicha(Tab[] ficha) {
        int[] cantidadPieza;
        int k = 0;
        cantidadPieza = new int[12];
        cantidadPieza[0] = 1;// Cantidad de Espia
        cantidadPieza[1] = 1;// Cantidad de Bandera
        cantidadPieza[2] = 8;// Cantidad de Soldados
        cantidadPieza[3] = 5;// Cantidad de Cabos desarmadores
        cantidadPieza[4] = 4;// Cantidad de Sargentos
        cantidadPieza[5] = 4;// Cantidad de Capitanes
        cantidadPieza[6] = 4;// Cantidad de Mayores
        cantidadPieza[7] = 3;// Cantidad de Tenientes
        cantidadPieza[8] = 2;// Cantidad de Coroneles
        cantidadPieza[9] = 1;// Cantidad de General
        cantidadPieza[10] = 1;// Cantidad de Mariscal
        cantidadPieza[11] = 6;// Cantidad de Bombas
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < cantidadPieza[i]; j++, k++) {
                ficha[k].setValor(i);
                switch (ficha[k].getValor()) {
                case 0:
                    ficha[k].setRango("Espia");
                    break;
                case 1:
                    ficha[k].setRango("Bandera");
                    break;
                case 2:
                    ficha[k].setRango("Soldado");
                    break;
                case 3:
                    ficha[k].setRango("Cabo desarmador");
                    break;
                case 4:
                    ficha[k].setRango("Sargento");
                    break;
                case 5:
                    ficha[k].setRango("Capitan");
                    break;
                case 6:
                    ficha[k].setRango("Mayor");
                    break;
                case 7:
                    ficha[k].setRango("Teniente");
                    break;
                case 8:
                    ficha[k].setRango("Coronel");
                    break;
                case 9:
                    ficha[k].setRango("General");
                    break;
                case 10:
                    ficha[k].setRango("Mariscal");
                    break;
                case 11:
                    ficha[k].setRango("Bomba");
                    break;
                }
            }
        }
    }
    public void imprimirTablero(Board t) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.print(t.getSquareFromBoard(i, j).getTab().getValor() + " ");
            }
            System.out.println();
        }
    }
    public void imprimirTablero() {
        war.imprimirTablero();        
    }
    public void setTableroFicha(Movement m) {
        m.getOrigen().getTab().setVisitaAgente(m.getOrigen().getPosX(), m.getOrigen().getPosY());
    }
    public void registrar(WarUser user, int type) {
        war.userRegistration(user, type);
    }
    public void playUser(Movement m, WarUser user) {
        war.moveTab(m, user);
        war.imprimirTablero();
    }
    public void addListener(WarTest t){
        war.addGameListener(t);
    }
    public void startGame() {
        war.startGame();
    }
    public void setBoard(WarUser user ,Board tablero) {
        war.setBoard(user,tablero);
    }
    public void moveTab (Movement m, WarUser user){
        war.moveTab(m,user);
    }
    public Board getBoard(WarUser user){
        return war.getBoard(user);
    }
}
